package de.androidbuch.amando.common;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Positionsdaten speichern. Kann fuer die 
 * Positionsbestimmung durch einen Remote-Service verwendet
 * werden.
 * 
 * @author Arno Becker, 2009 visionera gmbh
 * 
 */
public class GpsDataParcelable implements Parcelable {
  
  /** Speichert den Längengrad. */
  public double mLaengengrad;
  
  /** Speichert den Breitengrad. */
  public double mBreitengrad;
  
  /** Speichert die Höhe. */
  public double mHoehe;
  
  /** Speichert den Zeitstempel. */
  public long mZeitstempel;
  
  /**
   * Konstruktor zur Erzeugung eines GpsDataParcelable-
   * Objekts.
   * 
   * @param laengengrad Längengrad
   * @param breitengrad Breitengrad
   * @param hoehe Höhe
   * @param zeitstempel Zeitstempel
   */
  public GpsDataParcelable(final double laengengrad, 
      final double breitengrad, final double hoehe, 
      final long zeitstempel) {    
    this.mLaengengrad = laengengrad;
    this.mBreitengrad = breitengrad;
    this.mHoehe       = hoehe;
    this.mZeitstempel = zeitstempel;
  }
  
  /**
   * Erzeuger für dieses Objekt.
   */
  public static final Parcelable.Creator<GpsDataParcelable> 
      CREATOR = 
        new Parcelable.Creator<GpsDataParcelable>() {
    
    public GpsDataParcelable createFromParcel(
        final Parcel in) {
      return new GpsDataParcelable(in);
    }

    public GpsDataParcelable[] newArray(final int size) {
        return new GpsDataParcelable[size];
    }
  };

  /** 
   * Interner Konstruktor zum Einlesen der serlialisierten 
   * Objektdaten.
   * 
   * @param in Stream mit den serialisierten Obejktdaten.
   */
  private GpsDataParcelable(Parcel in) {
      readFromParcel(in);
  }
  
  public void writeToParcel(final Parcel out, 
      final int flags) {
    out.writeLong(mZeitstempel);
    out.writeDouble(mLaengengrad);
    out.writeDouble(mBreitengrad);
    out.writeDouble(mHoehe);
  }
    
  /**
   * Deserialiert ein GpsDataParcelable-Object aus dem
   * Stream in in dieses Objekt. Alle Objekt-Attribute
   * sind hinterher gesetzt.
   * 
   * @param in Serialisertes GpsDataParcelable-Objekt.
   */
  public void readFromParcel(final Parcel in) {
    mZeitstempel = in.readLong();
    mLaengengrad = in.readDouble();
    mBreitengrad = in.readDouble();
    mHoehe = in.readDouble();
  }

  public int describeContents() {
    return 0;
  }
  
  @Override
  public String toString() {
    return "GpsData [mBreitengrad=" + mBreitengrad
        + ", mHoehe=" + mHoehe + ", mLaengengrad="
        + mLaengengrad + ", mZeitstempel=" + mZeitstempel
        + "]";
  }
  
  /**
   * Konvertiert dieses Objekt in ein GpsData-Obejekt.
   * 
   * @return Ein aus diesem Objekt erzeugtes GpsData-Objekt.
   */
  public GpsData toGpsData() {
    return new GpsData(this.mLaengengrad,
        this.mBreitengrad, this.mHoehe, 
        this.mZeitstempel);
  }

}
